.TH std::prev 3 "2024.06.10" "http://cppreference.com" "C++ Standard Libary"
.SH NAME
std::prev \- std::prev

.SH Synopsis
   Defined in header <iterator>
   template< class BidirIt >                                              \fI(since C++11)\fP
   BidirIt prev( BidirIt it, typename                                     \fI(until C++17)\fP
   std::iterator_traits<BidirIt>::difference_type n = 1 );
   template< class BidirIt >

   constexpr                                                              \fI(since C++17)\fP

   BidirIt prev( BidirIt it, typename
   std::iterator_traits<BidirIt>::difference_type n = 1 );

   Return the n^th predecessor (or -n^th successor if n is negative) of iterator it.

.SH Parameters

   it        -        an iterator
   n         -        number of elements it should be descended
.SH Type requirements
   -
   BidirIt must meet the requirements of LegacyBidirectionalIterator.

.SH Return value

   An iterator of type BidirIt that holds the n^th predecessor (or -n^th successor if n
   is negative) of iterator it.

.SH Complexity

   Linear.

   However, if BidirIt additionally meets the requirements of
   LegacyRandomAccessIterator, complexity is constant.

.SH Possible implementation

   template<class BidirIt>
   constexpr // since C++17
   BidirIt prev(BidirIt it, typename std::iterator_traits<BidirIt>::difference_type n = 1)
   {
       std::advance(it, -n);
       return it;
   }

.SH Notes

   Although the expression --c.end() often compiles, it is not guaranteed to do so:
   c.end() is an rvalue expression, and there is no iterator requirement that specifies
   that decrement of an rvalue is guaranteed to work. In particular, when iterators are
   implemented as pointers or its operator-- is lvalue-ref-qualified, --c.end() does
   not compile, while std::prev(c.end()) does.

.SH Example


// Run this code

 #include <iostream>
 #include <iterator>
 #include <vector>

 int main()
 {
     std::vector<int> v{3, 1, 4};

     auto it = v.end();
     auto pv = std::prev(it, 2);
     std::cout << *pv << '\\n';

     it = v.begin();
     pv = std::prev(it, -2);
     std::cout << *pv << '\\n';
 }

.SH Output:

 1
 4

.SH See also

   next         increment an iterator
   \fI(C++11)\fP      \fI(function template)\fP
   advance      advances an iterator by given distance
                \fI(function template)\fP
   distance     returns the distance between two iterators
                \fI(function template)\fP
   ranges::prev decrement an iterator by a given distance or to a bound
   (C++20)      (niebloid)
